#pragma once

#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>

//==================================================================================================
// 
//==================================================================================================
class TaskQueue {
public:
    void Post(const std::function<void()>& task) {
        {
            std::lock_guard<std::mutex> lock(mutex_);
            queue_.push(task);
        }
        cv_.notify_one();
    }
    std::function<void()> Take() {
        std::unique_lock<std::mutex> lock(mutex_);
        cv_.wait(lock, [&] { return !queue_.empty(); });
        auto task = queue_.front();
        queue_.pop();
        return task;
    }
private:
    std::queue<std::function<void()>> queue_;
    std::mutex mutex_;
    std::condition_variable cv_;
};